package es.mfp.practicos.service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import es.mfp.practicos.DTO.ConsultaConsumosCriteria;
import es.mfp.practicos.dao.EmpleadoDAO;
import es.mfp.practicos.domain.ConsumoPuntos;
import es.mfp.practicos.domain.Empleado;
import es.mfp.practicos.domain.LineaFactura;

@Component("empleadoService")
public class EmpleadoServiceImpl implements EmpleadoService {

	@Autowired
	private EmpleadoDAO dao;

	@Autowired
	private LineaFacturaService lineaFacturaService;

	public void setDao(EmpleadoDAO dao) {
		this.dao = dao;
	}

	public void setLineaFacturaService(LineaFacturaService lineaFacturaService) {
		this.lineaFacturaService = lineaFacturaService;
	}

	@Override
	public List<Empleado> getEmpleados() {
		return dao.getAll();
	}

	@Override
	public Empleado buscarPorId(Long id) {
		return dao.findByPK(id);
	}

	@Override
	public void guardar(Empleado e) {
		dao.update(e);
	}

	@Override
	public void insertar(Empleado e, Integer puntosIniciales) {

		e.setConsumos(null);

		ConsumoPuntos cp = new ConsumoPuntos();
		cp.setConcepto("Valor inicial alta empleado");
		cp.setFechaConsumo(new Date());
		cp.setPuntosConsumidos(puntosIniciales);

		e.addConsumo(cp);

		dao.insert(e);
	}

	@Override
	public List<Empleado> getEmpleadosActivos() {
		return dao.findActivos();
	}

	@Override
	public Boolean eliminar(Long idEmpleado) {
		if (esEliminable(idEmpleado)) {
			dao.delete(idEmpleado);
			return Boolean.TRUE;
		} else {
			return Boolean.FALSE;
		}

	}

	private Boolean esEliminable(Long idEmpleado) {
		ConsultaConsumosCriteria crit = new ConsultaConsumosCriteria();
		List<Long> params = new ArrayList<Long>(1);
		params.add(idEmpleado);
		crit.setIdsEmpleado(params);
		crit.setSoloEmpleadosActivos(false);
		crit.setSoloFacturasActivas(false);
		crit.setSoloLineasActivas(false);

		List<LineaFactura> apariciones = lineaFacturaService.buscar(crit);
		if (apariciones == null || apariciones.isEmpty()) {
			return Boolean.TRUE;
		} else {
			return Boolean.FALSE;
		}

	}
}
